aboutsummaryrefslogtreecommitdiff
path: root/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx')
-rw-r--r--src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx
new file mode 100644
index 0000000..21cd613
--- /dev/null
+++ b/src/app/(main)/websites/[websiteId]/settings/WebsiteData.tsx
@@ -0,0 +1,104 @@
+import { Button, Column, Dialog, DialogTrigger, Modal } from '@umami/react-zen';
+import { ActionForm } from '@/components/common/ActionForm';
+import {
+ useLoginQuery,
+ useMessages,
+ useModified,
+ useNavigation,
+ useUserTeamsQuery,
+} from '@/components/hooks';
+import { ROLES } from '@/lib/constants';
+import { WebsiteDeleteForm } from './WebsiteDeleteForm';
+import { WebsiteResetForm } from './WebsiteResetForm';
+import { WebsiteTransferForm } from './WebsiteTransferForm';
+
+export function WebsiteData({ websiteId, onSave }: { websiteId: string; onSave?: () => void }) {
+ const { formatMessage, labels, messages } = useMessages();
+ const { user } = useLoginQuery();
+ const { touch } = useModified();
+ const { router, pathname, teamId, renderUrl } = useNavigation();
+ const { data: teams } = useUserTeamsQuery(user.id);
+ const isAdmin = pathname.startsWith('/admin');
+
+ const canTransferWebsite =
+ (
+ (!teamId &&
+ teams?.data?.filter(({ members }) =>
+ members.find(
+ ({ role, userId }) =>
+ [ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id,
+ ),
+ )) ||
+ []
+ ).length > 0 ||
+ (teamId &&
+ !!teams?.data
+ ?.find(({ id }) => id === teamId)
+ ?.members.find(({ role, userId }) => role === ROLES.teamOwner && userId === user.id));
+
+ const handleSave = () => {
+ touch('websites');
+ onSave?.();
+ router.push(renderUrl(`/websites`));
+ };
+
+ const handleReset = async () => {
+ onSave?.();
+ };
+
+ return (
+ <Column gap="6">
+ {!isAdmin && (
+ <ActionForm
+ label={formatMessage(labels.transferWebsite)}
+ description={formatMessage(messages.transferWebsite)}
+ >
+ <DialogTrigger>
+ <Button isDisabled={!canTransferWebsite}>{formatMessage(labels.transfer)}</Button>
+ <Modal>
+ <Dialog title={formatMessage(labels.transferWebsite)} style={{ width: 400 }}>
+ {({ close }) => (
+ <WebsiteTransferForm websiteId={websiteId} onSave={handleSave} onClose={close} />
+ )}
+ </Dialog>
+ </Modal>
+ </DialogTrigger>
+ </ActionForm>
+ )}
+
+ <ActionForm
+ label={formatMessage(labels.resetWebsite)}
+ description={formatMessage(messages.resetWebsiteWarning)}
+ >
+ <DialogTrigger>
+ <Button>{formatMessage(labels.reset)}</Button>
+ <Modal>
+ <Dialog title={formatMessage(labels.resetWebsite)} style={{ width: 400 }}>
+ {({ close }) => (
+ <WebsiteResetForm websiteId={websiteId} onSave={handleReset} onClose={close} />
+ )}
+ </Dialog>
+ </Modal>
+ </DialogTrigger>
+ </ActionForm>
+
+ <ActionForm
+ label={formatMessage(labels.deleteWebsite)}
+ description={formatMessage(messages.deleteWebsiteWarning)}
+ >
+ <DialogTrigger>
+ <Button data-test="button-delete" variant="danger">
+ {formatMessage(labels.delete)}
+ </Button>
+ <Modal>
+ <Dialog title={formatMessage(labels.deleteWebsite)} style={{ width: 400 }}>
+ {({ close }) => (
+ <WebsiteDeleteForm websiteId={websiteId} onSave={handleSave} onClose={close} />
+ )}
+ </Dialog>
+ </Modal>
+ </DialogTrigger>
+ </ActionForm>
+ </Column>
+ );
+}